Red Hat Enterprise Linux 8でlogrotateを使ってログファイルを1時間ごとにローテーションさせてみた
こんにちは!AWS事業本部のおつまみです。
みなさん、 Red Hat Enterprise Linux8 で logrotate を使って、ログファイルを1時間ごとにローテーションさせたいと思ったことはありますか?私はあります。
logrotate は、ログファイルをローテーションし、必要に応じて圧縮などを行うツールです。
先日こちらの記事でRed Hat Enterprise Linux9 で同様なことができないか調査しました。
この記事の中で、以下のように記載しています。
Red Hat Enterprise Linux 9 以降はsystemd-timerを使い、logrotateが行われるようになっていました。
ということは、Red Hat Enterprise Linux 9 以前のバージョンではcronで動いているんじゃないかなと気になったので確認してみました。
いきなり結論
- Red Hat Enterprise Linux 8 の logrotate は
systemd-timer
ではなく、cron
で起動している。 - デフォルトでは、 logrotate は日次で起動するようになっている。
- 1時間ごとにローテションさせるには、
cron.daily
内のlogrotate
をcron.hourly
に移動させる必要がある。
検証環境
- Red Hat Enterprise Linux 8 (HVM), SSD Volume Type
環境の確認
まず、systemd-timer
で動いていないことを確認するために、設定ファイル/usr/lib/systemd/system/logrotate.timer
があるか確認します。
ll /usr/lib/systemd/system/*.timer -rw-r--r--. 1 root root 138 Jul 14 2022 /usr/lib/systemd/system/[email protected] -rw-r--r--. 1 root root 320 Apr 12 2021 /usr/lib/systemd/system/dnf-makecache.timer -rw-r--r--. 1 root root 229 Apr 3 09:55 /usr/lib/systemd/system/fstrim.timer -rw-r--r--. 1 root root 696 Mar 2 2021 /usr/lib/systemd/system/insights-client.timer -rw-r--r--. 1 root root 130 Oct 10 2022 /usr/lib/systemd/system/nm-cloud-setup.timer -rw-r--r--. 1 root root 490 Jun 22 2018 /usr/lib/systemd/system/systemd-tmpfiles-clean.timer -rw-r--r--. 1 root root 346 Nov 9 2022 /usr/lib/systemd/system/unbound-anchor.timer
logrotate.timer
が見当たらないですね。
次にcron下を確認してみます。
ls /etc/cron* /etc/cron.deny /etc/crontab /etc/cron.d: 0hourly /etc/cron.daily: logrotate update-client-config-packages /etc/cron.hourly: 0anacron /etc/cron.monthly: /etc/cron.weekly:
cron.daily
内にlogrotate
がありました!
このことからRed Hat Enterprise Linux 8 の logrotate はsystemd-timer
ではなく、cron
で起動していることがわかりますね。
この状態でlogrotate.d下にある設定ファイル/etc/logrotate.conf
と/etc/logrotate.d/tomcat
を以下のように設定しました。
# see "man logrotate" for details # rotate log files weekly weekly # keep 4 weeks worth of backlogs rotate 4 # create new (empty) log files after rotating old ones create # use date as a suffix of the rotated file dateext # uncomment this if you want your log files compressed #compress # RPM packages drop log rotation information into this directory include /etc/logrotate.d # system-specific logs may be also be configured here.
/var/log/tomcat/catalina.out { hourly missingok rotate 24 ifempty dateext compress }
※ 今回は検証のため、catalina.out
のみローテーションさせるように設定しています。
各パラメータの詳細について知りたい方はこちらの記事がわかりやすいので、ご参考ください。
ログローテートソフトウエア logrotate についてまとめ - Qiita
/etc/logrotate.d/tomcat
内でhourly
で設定したため、1時間ごとにローテーションされるかなと思いきや、いつまで経ってもローテーションされませんでした。
ちなみにlogrotateは設定ファイルを変更しても、再起動などは不要です。
なお以下は確認済でした。
- デバックモードでの起動
logrotate -dv /etc/logrotate.d/tomcat
でerrorが出ないこと。 - 手動での強制ローテーション
logrotate -f /etc/logrotate.d/tomcat
では正常にローテーションされること。 - 自動ローテーションの場合、日次でのローテーションは実行されている。
原因
原因はlogrotate
がcron.daily
にあるためでした。
そのためlogrotateは日次でしかローテーションされることが初期設定となっています。
対処方法
cron.daily
内のlogrotate
をcron.hourly
に移動させ、cronを再起動させます。
以下のコマンドをroot権限、もしくはsudo
をつけて実行するだけです。
cp /etc/cron.daily/logrotate /etc/cron.hourly/
このまま1時間程度経過後、確認してみます。
ll /var/log/tomcat/catalina.out* -rw-r--r--. 1 root root 0 Sep 11 02:01 catalina.out -rw-r--r--. 1 root root 845 Sep 11 01:34 catalina.out-2023091101.gz
ローテーションされていることが確認できました!
なおcronはサーバの停止中、タスクを実行しません。
そのため、指定した時刻に実行できなかった場合、次回の指定時刻まで待つ必要があります。
systemd-timer
との違いになるので、注意してください。
さいごに
今回はRed Hat Enterprise Linux 8 で logrotateを使ってログファイルを1時間ごとにローテーションさせる方法をお伝えしました。
今回の検証からRed Hat Enterprise Linux 8 以前 → 9に移行した場合にlogrotateの扱い方に注意しなければいけないことがわかりました。
どなたかのお役に立てれば幸いです。 最後までお読みいただきありがとうございました!
以上、おつまみ(@AWS11077)でした!
参考資料
ログローテートソフトウエア logrotate についてまとめ - Qiita
第27章 システムタスクの自動化 Red Hat Enterprise Linux 6 | Red Hat Customer Portal